# -*- coding: utf-8 -*-
"""
    @project: pythonProject
    @Author：HanYonghua
    @file： phaseerror.py
    @date：2025/6/17 17:50
    @blogs: https://www.ncatest.com.cn
"""

import numpy as np


def calculate_phase_error(i_samples, q_samples):
    """
    计算I/Q信号间的相位误差（单位：弧度）
    修正说明：
    1. 使用更稳健的arcsin公式
    2. 自动去除直流分量
    3. 添加输入校验
    """
    # 输入校验
    i_samples = np.asarray(i_samples)
    q_samples = np.asarray(q_samples)
    if len(i_samples) != len(q_samples):
        raise ValueError("I/Q信号长度必须相同")

    # 去除直流分量
    i_centered = i_samples - np.mean(i_samples)
    q_centered = q_samples - np.mean(q_samples)

    # 计算归一化互相关
    r_iq = np.dot(i_centered, q_centered) / len(i_samples)
    r_ii = np.dot(i_centered, i_centered) / len(i_samples)
    r_qq = np.dot(q_centered, q_centered) / len(q_samples)

    # 使用arcsin公式（更抗幅度不平衡影响）
    normalization_factor = np.sqrt(r_ii * r_qq)
    if normalization_factor < 1e-10:  # 避免除以零
        return 0.0
    phase_error = np.arcsin(2 * r_iq / (r_ii + r_qq))

    return phase_error


# 测试用例：验证修正效果
if __name__ == "__main__":
    fs = 1000  # 采样率
    t = np.arange(0, 1, 1 / fs)
    f = 10  # 信号频率

    # Case 1: 理想正交信号（相位差0°）
    i_ideal = np.cos(2 * np.pi * f * t)
    q_ideal = np.sin(2 * np.pi * f * t)
    print(f"理想正交信号相位差: {np.degrees(calculate_phase_error(i_ideal, q_ideal)):.2f}°")

    # Case 2: 添加5°相位误差
    phi_error = np.radians(5)
    q_phase_error = np.sin(2 * np.pi * f * t + phi_error)
    print(f"5°相位误差测量结果: {np.degrees(calculate_phase_error(i_ideal, q_phase_error)):.2f}°")

    # Case 3: 添加幅度不平衡（I路幅度1.0，Q路幅度0.8）
    q_amp_error = 0.8 * np.sin(2 * np.pi * f * t)
    print(f"幅度不平衡下的相位差: {np.degrees(calculate_phase_error(i_ideal, q_amp_error)):.2f}°")